package br.com.mauricioreis;

import java.util.Calendar;
import java.util.List;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.ListView;
import br.com.mauricioreis.db.Refeicao;
import br.com.mauricioreis.db.Util;

public class RefeicaoAct extends Activity {
    private ListView viewRefeicao;
    private Button buttonIncluir;
    private Button buttonModificarData;
    private Button buttonConsultarConsumo;
    private int ano;
    private int mes;
    private int dia;
    // the callback received when the user "sets" the date in the dialog
    private final DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            ano = year;
            mes = monthOfYear;
            dia = dayOfMonth;
            updateButtonModificarData();
        }
    };

    /** atributo criado para marcar o item selecionado no evento onCreateContextMenu */
    private Refeicao itemSelecionado;
    private static final int INCLUIR_ID = Menu.FIRST;
    private static final int ALTERAR_ID = Menu.FIRST + 1;
    private static final int EXCLUIR_ID = Menu.FIRST + 2;
    private static final int CONSULTAR_CONSUMO_ID = Menu.FIRST + 3;
    public static final int DATE_DIALOG_ID = Menu.FIRST + 4;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.refeicao);
        montaBotaoIncluir();
        montaBotaoModificarData();
        montaBotaoConsultarConsumo();
        montaViewRefeicao();

        registerForContextMenu(viewRefeicao);

    }

    private void montaBotaoModificarData() {
        buttonModificarData = (Button) findViewById(R.id.refeicaoModificarData);

        // faz o clique do botão mostrar uma caixa de dialogo
        buttonModificarData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showDialog(DATE_DIALOG_ID);
            }
        });

        // pega a data atual para inicializar o botão de data
        final Calendar c = Calendar.getInstance();
        ano = c.get(Calendar.YEAR);
        mes = c.get(Calendar.MONTH);
        dia = c.get(Calendar.DAY_OF_MONTH);

        // display the current date (this method is below)
        updateButtonModificarData();

    }

    /**
     * Atualiza a data do botão que modifica e mostra a data
     */
    private void updateButtonModificarData() {
        buttonModificarData.setText(new StringBuilder()
        // Month is 0 based so add 1
                .append(dia).append("/").append(mes + 1).append("/").append(ano).append(" "));
        montaViewRefeicao();
    }

    /**
     * Chamado sempre que uma caixa de dialogo é criada
     */
    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DATE_DIALOG_ID:
            return new DatePickerDialog(this, mDateSetListener, ano, mes, dia);
        }
        return null;
    }

    private void montaBotaoConsultarConsumo() {
        buttonConsultarConsumo = (Button) findViewById(R.id.refeicaoConsultarConsumo);
        buttonConsultarConsumo.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                Intent i = new Intent(RefeicaoAct.this, ConsumoAct.class);
                i.putExtra("dia", dia);
                i.putExtra("mes", mes);
                i.putExtra("ano", ano);
                startActivityForResult(i, CONSULTAR_CONSUMO_ID);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        montaViewRefeicao();
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        // Pega posição do item selecionado
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
        int posicaoItem = info.position;
        // pega o objeto refeicao da posição selecionada
        itemSelecionado = (Refeicao) viewRefeicao.getItemAtPosition(posicaoItem);
        menu.add(0, EXCLUIR_ID, 0, "Excluir");
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case EXCLUIR_ID:
            if (itemSelecionado != null) {
                Refeicao.excluir(RefeicaoAct.this, itemSelecionado);
                montaViewRefeicao();
                itemSelecionado = null;
                return true;
            }
        }
        return super.onContextItemSelected(item);
    }

    private void montaBotaoIncluir() {
        buttonIncluir = (Button) findViewById(R.id.refeicaoIncluir);
        buttonIncluir.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // Cria um Intent passando a atividade atual e a classe da atividade seguinte
                Intent i = new Intent(RefeicaoAct.this, RefeicaoIncluirAct.class);
                i.putExtra("dia", dia);
                i.putExtra("mes", mes);
                i.putExtra("ano", ano);
                startActivityForResult(i, INCLUIR_ID);
            }
        });
    }

    private void montaViewRefeicao() {
        List<Refeicao> refeicoes = Refeicao.listar(this, Util.montaDatayyyyMMdd(ano, mes, dia));
        ArrayAdapter<Refeicao> adapterRefeicao = new ArrayAdapter<Refeicao>(this, android.R.layout.simple_list_item_1, refeicoes);
        viewRefeicao = (ListView) findViewById(R.id.ListView01);
        viewRefeicao.setAdapter(adapterRefeicao);
        montaClickAlterar();
    }

    private void montaClickAlterar() {
        viewRefeicao.setOnItemClickListener(new OnItemClickListener() {
            @Override
            @SuppressWarnings(value = "rawtypes")
            public void onItemClick(AdapterView arg0, View arg1, int posicaoItem, long arg3) {
                // pega o objeto refeicao da posição selecionada
                Refeicao refeicaoSelecionada = (Refeicao) viewRefeicao.getItemAtPosition(posicaoItem);
                // Cria um Intent passando a atividade atual e a classe da atividade seguinte
                Intent i = new Intent(RefeicaoAct.this, RefeicaoIncluirAct.class);
                i.putExtra("idRefeicao", refeicaoSelecionada.getId());
                i.putExtra("dia", dia);
                i.putExtra("mes", mes);
                i.putExtra("ano", ano);
                startActivityForResult(i, ALTERAR_ID);

            }
        });
    }

}
